<?php
include_once $_SERVER["DOCUMENT_ROOT"].'/service/entite/Entite.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/outils/database/Database.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/outils/exceptions/DAOException.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/service/entite/compte/CompteEntite.php';

class CompteDAO {
	
	private function CompteDAO() {
		//évite la construction
	}
		
	public static function getListeCompte() {
		$database = Database::getInstance();
		$result = $database->executeQueryAndClose("SELECT id, dateheurecreation,login,motdepasse FROM compte ORDER BY login");
		$CompteArray = Array();
		foreach ($result as $row) {
			$CompteArray[] = CompteDAO::getComptesFromDatabaseRow($row);
		}
		return $CompteArray;
	}
	
	public static function getCompteByID($id) {
		$result = Database::getInstance()->executeQueryAndClose("SELECT id, dateheurecreation,login,motdepasse FROM compte WHERE id =$id");
		foreach ($result as $row){
			return CompteDAO::getComptesFromDatabaseRow($row);
		}
		throw new MissingDataException("Impossible de trouver le compte avec l'ID ${id}");
	}
	
	public static function save(CompteEntite $compteEntite) {
		if($compteEntite->id == Entite::getUnpersistedId()) {
			$result = CompteDAO::insert($compteEntite);
		} else {
			$result = CompteDAO::update($compteEntite);
			if ($result > 1) {
				$login = $compteEntite->login;
				throw new DAOException("La sauvegarde du compte '$login' a mis à jour $result lignes");
			}
		}
	}
	
	public static function getCompte($login, $motDePasse) {
		$motDePasse = md5($motDePasse);
		$result = Database::getInstance()->executeQueryAndClose("SELECT id, dateheurecreation,login,motdepasse FROM compte WHERE login ='$login' AND motDePasse ='$motDePasse'");
		foreach ($result as $row){
			return CompteDAO::getComptesFromDatabaseRow($row);
		}
		throw new MissingDataException("Impossible de trouver le compte avec le login '$login' et le mot de passe spécifié");
	}
	
	public static function delete($id) {
		$result = Database::getInstance()->executeUpdateQueryAndClose("DELETE FROM compte WHERE id = $id") ;
		return $result;
	}
	
	private static function insert(CompteEntite $compteEntite) {
		$login = mysql_escape_string($compteEntite->login);
		$motdepasse = md5(mysql_escape_string($compteEntite->motDePasse));
		
		$result = Database::getInstance()->executeInsertQuery("INSERT INTO compte (dateheurecreation,login,motdepasse) values (NOW(),'$login','$motdepasse')") ;
		return $result;
	}
	public static function saveListeIdRole($compte, $listeIdRole) {
		//Supprime l'ancienne liste de rôles
		Database::getInstance()->executeUpdateQueryAndClose("DELETE FROM compte_role WHERE id_compte = $compte->id") ;
		
		//ajoute les nouveaux rôles
		foreach($listeIdRole as $idRole) {
			Database::getInstance()->executeInsertQuery("INSERT INTO compte_role (id_compte,id_role) values ($compte->id,$idRole)") ;
		}
	}
	
	private static function update(CompteEntite $compteEntite) {
		$login = mysql_escape_string($compteEntite->login);
		if ($compteEntite->motDePasse == $compteEntite->motDePasseOriginal) {
			//Le mot de passe n'a pas été modifié, IL NE FAUT DONC PAS LE REENCODER (car il est déjà en MD5)
			$motdepasse = $compteEntite->motDePasseOriginal;
		} else {
			//Le mot de passe a été modifié, il faut le réencoder en MD5
			$motdepasse = md5(mysql_escape_string($compteEntite->motDePasse));
		}
		$result = Database::getInstance()->executeUpdateQueryAndClose("UPDATE Compte SET dateheurecreation = '$compteEntite->dateheureCreation',login = '$login', motdepasse = '$motdepasse' WHERE id = $compteEntite->id");
		return $result;
	}
	
	public static function getListeIdRoleAssocieACompte($idCompte) {
		$database = Database::getInstance();
		$result = $database->executeQueryAndClose("SELECT id_role FROM compte_role WHERE id_compte = $idCompte");
		$idRoleArray = Array();
		foreach ($result as $row) {
			$idRoleArray[] = $row['id_role'];
		}
		return $idRoleArray;
	}
	
	private static function getComptesFromDatabaseRow($row) {
		$compteEntite = new CompteEntite();
		$compteEntite->id = $row['id'];
		$compteEntite->dateheurecreation = $row['dateheurecreation'];
		$compteEntite->login = $row['login'];
		$compteEntite->motDePasse = $row['motdepasse'];
		$compteEntite->motDePasseOriginal = $row['motdepasse'];
		return $compteEntite;
	}
	
	
}
?>